package com.ideviu.service.impl;

import com.ideviu.dao.AnuncioDao;
import com.ideviu.dao.NegocioDao;
import com.ideviu.model.Anuncio;
import com.ideviu.model.Negocio;
import com.ideviu.service.AnuncioExistsException;
import com.ideviu.service.AnuncioManager;
import com.ideviu.service.DataNotFoundException;
import com.ideviu.service.NegocioExistsException;
import com.ideviu.service.NegocioManager;
import com.ideviu.service.impl.GenericManagerImpl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.orm.jpa.JpaSystemException;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service("anuncioManager")
public class AnuncioManagerImpl extends GenericManagerImpl<Anuncio, Long> implements AnuncioManager {
   
	@Autowired
    private AnuncioDao anuncioDao;

    public void setAnuncioDao(AnuncioDao anuncioDao) {
        super.dao = anuncioDao;
    	this.anuncioDao = anuncioDao;
    }

    /**
     * {@inheritDoc}
     */
    public Anuncio getAnuncio(String anuncioId) {
        return anuncioDao.get(new Long(anuncioId));
    }

    /**
     * {@inheritDoc}
     */
    public Anuncio saveAnuncio(Anuncio anuncio) throws AnuncioExistsException {

        if (anuncio.getVersion() == null) {
            // Si el anuncio es nuevo....
            
        }

        try {
        	return anuncioDao.saveAnuncio(anuncio);
        } catch (DataIntegrityViolationException e) {
            //e.printStackTrace();
            log.warn(e.getMessage());
            throw new AnuncioExistsException("Anuncio '" + anuncio.getId() + " - " + anuncio.getNombre() + "' ya existe!");
        } catch (JpaSystemException e) { // needed for JPA
            //e.printStackTrace();
            log.warn(e.getMessage());
            throw new AnuncioExistsException("Anuncio '" + anuncio.getId() + " - " + anuncio.getNombre() + "' ya existe!");
        }
    }

    /**
     * {@inheritDoc}
     */
    public void removeAnuncio(String anuncioId) {
        log.debug("eliminando anuncio: " + anuncioId);
        anuncioDao.remove(new Long(anuncioId));
    }

    /**
     * {@inheritDoc}
     */
    public List<Anuncio> search(String searchTerm) {
        return super.search(searchTerm, Anuncio.class);
    }
    
    /**
     * {@inheritDoc}
     *
     * @param username the login name of the human
     * @return User the populated user object
     * @throws UsernameNotFoundException thrown when username not found
     * @throws DataNotFoundException 
     * @throws NumberFormatException 
     */
    public List<Anuncio> getAnunciosByIdNegocio(String idNegocio) throws DataNotFoundException {
        try{
        	return anuncioDao.getAnunciosByIdNegocio(new Long(idNegocio));
        } catch(NumberFormatException nfe){
        	throw new DataNotFoundException("No existen anuncios asociados al negocio con id '" + idNegocio);
        }	
    }
}
